#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int ntimes = 0;

main()
{
    int pid, ppid;
    int p_action(),c_action();
    signal(SIGUSR1, p_action); // 设定父进程的SIGUSR1

    switch (pid = fork())
    {
    case -1: // fork 失败
        perror("synchro");
        break;
    
    case 0: // 子进程
        signal(SIGUSR1, c_action); // 设定子进程的SIGUSR1
        ppid = getppid(); // 获得父进程的标识符
        for(;;) { // 死循环
            sleep(1);
            kill(ppid, SIGUSR1); // 向父进程发送信号SIGUSR1来实现同步
            pause();
        }
        break;

    default: // 父进程
        for(;;) {
            pause();
            sleep(1);
            kill(pid,SIGUSR1); // 向子进程发送信号SIGUSR1来实现同步
        }
    }
}

p_action()
{
    printf("Patent caught signal #%d\n", ++ntimes);
}

c_action()
{
    printf("Child caught signal #%d\n", ++ntimes);
}